import { ApiProperty } from '@nestjs/swagger';
import { IsString, IsOptional, IsBoolean, IsNumber, Min, Max, MaxLength, MinLength, IsEnum } from 'class-validator';
import { FileType, ImportFrequency } from '../entities/match-import-config.entity';

/**
 * 创建比赛文件导入配置DTO
 */
export class CreateMatchImportConfigDto {
  @ApiProperty({ description: '配置名称', example: '竞彩北单文件导入' })
  @IsString()
  @MinLength(1, { message: '配置名称不能为空' })
  @MaxLength(100, { message: '配置名称不能超过100个字符' })
  name: string;

  @ApiProperty({ description: '文件导入目录路径', example: '/path/to/match/files' })
  @IsString()
  @MinLength(1, { message: '导入路径不能为空' })
  @MaxLength(500, { message: '导入路径不能超过500个字符' })
  importPath: string;

  @ApiProperty({ 
    description: '文件类型', 
    enum: FileType, 
    example: FileType.HOMEPAGE,
    required: false,
    default: FileType.HOMEPAGE 
  })
  @IsOptional()
  @IsEnum(FileType, { message: '文件类型必须是homepage或score' })
  fileType?: FileType;

  @ApiProperty({ 
    description: '导入频率类型', 
    enum: ImportFrequency, 
    example: ImportFrequency.DAILY,
    required: false,
    default: ImportFrequency.DAILY 
  })
  @IsOptional()
  @IsEnum(ImportFrequency, { message: '导入频率必须是daily或interval' })
  frequency?: ImportFrequency;

  @ApiProperty({ 
    description: '是否启用自动导入', 
    example: true, 
    required: false,
    default: true 
  })
  @IsOptional()
  @IsBoolean()
  isEnabled?: boolean;

  @ApiProperty({ 
    description: '配置描述', 
    example: '每天12:35自动导入竞彩北单首页文件', 
    required: false 
  })
  @IsOptional()
  @IsString()
  @MaxLength(500, { message: '配置描述不能超过500个字符' })
  description?: string;

  @ApiProperty({ 
    description: '导入时间(小时)', 
    example: 12, 
    required: false,
    default: 12 
  })
  @IsOptional()
  @IsNumber({}, { message: '导入小时必须是数字' })
  @Min(0, { message: '导入小时不能小于0' })
  @Max(23, { message: '导入小时不能大于23' })
  importHour?: number;

  @ApiProperty({ 
    description: '导入时间(分钟)', 
    example: 35, 
    required: false,
    default: 35 
  })
  @IsOptional()
  @IsNumber({}, { message: '导入分钟必须是数字' })
  @Min(0, { message: '导入分钟不能小于0' })
  @Max(59, { message: '导入分钟不能大于59' })
  importMinute?: number;

  @ApiProperty({ 
    description: '间隔时间(分钟)', 
    example: 30, 
    required: false,
    default: 30 
  })
  @IsOptional()
  @IsNumber({}, { message: '间隔时间必须是数字' })
  @Min(1, { message: '间隔时间不能小于1分钟' })
  @Max(1440, { message: '间隔时间不能大于1440分钟(24小时)' })
  intervalMinutes?: number;

  @ApiProperty({ 
    description: '最大重试次数', 
    example: 6, 
    required: false,
    default: 6 
  })
  @IsOptional()
  @IsNumber({}, { message: '最大重试次数必须是数字' })
  @Min(0, { message: '最大重试次数不能小于0' })
  @Max(20, { message: '最大重试次数不能大于20' })
  maxRetries?: number;

  @ApiProperty({ 
    description: '重试间隔(分钟)', 
    example: 5, 
    required: false,
    default: 5 
  })
  @IsOptional()
  @IsNumber({}, { message: '重试间隔必须是数字' })
  @Min(1, { message: '重试间隔不能小于1分钟' })
  @Max(60, { message: '重试间隔不能大于60分钟' })
  retryIntervalMinutes?: number;

  @ApiProperty({ 
    description: '失败原因', 
    example: '文件路径不存在或无权限访问', 
    required: false 
  })
  @IsOptional()
  @IsString()
  @MaxLength(2000, { message: '失败原因不能超过2000个字符' })
  failureReason?: string;
}